package com.hhu.wangzb.shiro.jwt.util;

import com.auth0.jwt.JWT;
import com.auth0.jwt.JWTCreator;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.DecodedJWT;
import com.hhu.wangzb.shiro.jwt.payload.ClaimsLoader;

import java.util.Date;

public class JwtUtils {

    // 密钥
    private static final String secret = "@jsda2j4j5";
    // 超时时间，7天
    private static final long expire = 7 * 24 * 60 * 60 * 1000;

    /**
     * 生成并返回令牌，令牌默认过期时间为7天
     * @param loader 用于为令牌添加负载
     */
    public static String generateToken(ClaimsLoader loader) {
        // 创建token
        JWTCreator.Builder builder = JWT.create();

        // 负载参数
        if (loader != null) loader.load(builder);

        // 设置超时时间
        Date date = new Date(System.currentTimeMillis() + expire);
        builder.withExpiresAt(date);

        // 设置签名，并返回token
        return builder.sign(Algorithm.HMAC256(secret));
    }

    public static String generateToken() {
        return generateToken(null);
    }

    /**
     * 验证令牌，可能抛出jwt相关异常
     * 验证成功返回DecodedJWT，可用于获取令牌负载
     */
    public static DecodedJWT verifyToken(String token) {
        return JWT.require(Algorithm.HMAC256(secret)).build().verify(token);
    }

    /**
     * 通过ClaimsLoader.reload方法将令牌负载封装到某个对象中
     * @param decodedJWT
     * @param loader
     */
    public static void packPayload(DecodedJWT decodedJWT, ClaimsLoader loader) {
        loader.reLoad(decodedJWT.getClaims());
    }

    public static String getString(String token, String key) {
        return verifyToken(token).getClaim(key).asString();
    };

    public static String[] getStringArr(String token, String key) {
        return verifyToken(token).getClaim(key).asArray(String.class);
    }

    public static Integer getInt(String token, String key) {
        return verifyToken(token).getClaim(key).asInt();
    };

}
